package csl.blog.common.utils;

import csl.blog.common.utils.enums.DateEnum;
import lombok.Data;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * @Description: TODO 日期操作工具类
 * @author: 隔山海
 * @date: 2021年08月13日 23:01
 */
@Data
public final class DateUtils {

    DateUtils(){}

    public static final ZoneId DEFAULT_ZONE_ID = ZoneId.systemDefault();

    /**
     * 当前时间的格式化日期 yyyy-MM-dd HH:mm:ss 格式
     *
     * @return 日期字符串
     */
    public static String format() {
        return format(new Date(), DateEnum.NORM_DATETIME_PATTERN);
    }

    /**
     * 格式化LocalDateTime 为指定格式字符串
     *
     * @return 日期字符串
     */
    public static String format(LocalDateTime ldt, DateEnum dateEnum) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(dateEnum.getCode());
        return dtf.format(ldt);
    }

    /**
     * 格式化日期 yyyy-MM-dd HH:mm:ss 格式
     *
     * @param date 日期类型
     * @return 日期字符串
     */
    public static String format(Object date) {
        return format(date, DateEnum.NORM_DATETIME_PATTERN);
    }


    /**
     * 格式化日期
     *
     * @param date    日期类型
     * @param dateEnum 不填默认为yyyy-MM-dd HH:mm:ss 格式
     * @return 根据入参格式化字符串
     */
    public static String format(Object date, DateEnum dateEnum) {
        if (date == null) {
            return null;
        }
        if (dateEnum.getCode() == null) {
            return format(date);
        }
        return new SimpleDateFormat(dateEnum.getCode()).format(date);
    }

    /**
     * 格式化日期
     *
     * @param date LocalDate pattern 格式
     * @return 12:12
     */
    public static String  format(LocalDate date, DateEnum dateEnum) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(dateEnum.getCode());
        return dtf.format(date);
    }

    /**
     * 格式化日期
     *
     * @param time localTime pattern 格式
     * @return 12:12
     */
    public static String  format(LocalTime time, DateEnum dateEnum) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(dateEnum.getCode());
        return dtf.format(time);
    }


    /**
     * 字符串转换成 LocalTime
     *
     * @param time 字符串  12:23 格式
     * @return LcalTime
     */
    public static LocalTime parseTime(String time) {
        return LocalTime.parse(time, DateTimeFormatter.ofPattern(DateEnum.HH_MM.getCode()));
    }

    /**
     * 字符串转换成 LocalTime
     *
     * @param time 字符串  转localtime
     * @return LcalTime
     */
    public static LocalTime parseTime(String time, DateEnum dateEnum) {
        return LocalTime.parse(time, DateTimeFormatter.ofPattern(dateEnum.getCode()));
    }




    /**
     * 字符串转换成 LocalDate
     *
     * @param date 字符串  2020-01-12 格式
     * @return LcalTime
     */
    public static LocalDate parseLocalDate(String date) {
        return LocalDate.parse(date, DateTimeFormatter.ofPattern(DateEnum.NORM_DATE_PATTERN.getCode()));
    }

    /**
     * LocalDate转换成 字符串
     *
     * @param date  LocalDate
     * @return 字符串 2020-01-12
     */
    public static String formatLocalDate(LocalDate date) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(DateEnum.NORM_DATE_PATTERN.getCode());
        return dtf.format(date);
    }

    /**
     * 日期时间转换
     */
    public static Date string2Date(String dtStr, DateEnum dateEnum) throws ParseException {
        DateFormat df = new SimpleDateFormat(dateEnum.getCode());
        return df.parse(dtStr);
    }

    /**
     * 日期时间转换
     */
    public static LocalDateTime date2LocalDateTime(Date dt) {
        Instant instant = dt.toInstant();
        return instant.atZone(DEFAULT_ZONE_ID).toLocalDateTime();
    }

    /**
     * 日期时间转换
     */
    public static LocalDateTime date2LocalDateTime(Date dt, ZoneId zoneId) {
        Instant instant = dt.toInstant();
        return instant.atZone(zoneId).toLocalDateTime();
    }

    /**
     * 日期时间转换
     */
    public static Date localDateTime2Date(LocalDateTime ldt) {
        return localDateTime2Date(ldt, DEFAULT_ZONE_ID);
    }

    /**
     * 日期时间转换
     */
    public static Date localDateTime2Date(LocalDateTime ldt, ZoneId zoneId) {
        Date dt = Date.from(ldt.atZone(zoneId).toInstant());
        return dt;
    }


    /**
     * 时间戳转换成LocalDateTime
     */
    public static LocalDateTime timestamToDatetime(long timestamp) {
        Instant instant = Instant.ofEpochMilli(timestamp);
        return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
    }

    /**
     * 时间戳转换成LocalDate
     */
    public static LocalDate timestamToDate(long timestamp) {
        LocalDateTime date = timestamToDatetime(timestamp);
        return date.toLocalDate();
    }
}
